package com.ai.vr.service;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

import java.io.File;

/**
 * OpenVR 接口
 * @author houwenpeng
 */
public interface OpenVR extends Library {

    // 根据不同操作系统动态设置本地库文件路径
    String dllPath = getLibraryPath();  // 本地库路径

    OpenVR INSTANCE = (OpenVR) Native.load(dllPath, OpenVR.class); // 映射本地库

    // 直接传递 `initResult` 引用
    int VR_InitInternal(IntByReference eVRApplicationType, String pStartupInfo);

    /**
     *  VR 内部初始化
      */
//    int VR_InitInternal(int eVRApplicationType, String pStartupInfo);
    /**
     * VR是否已安装
     * @return
     */
//    boolean VR_IsRuntimeInstalled();

    /**
     * VR系统_将设备设置为绝对跟踪姿态
     * @param eTrackingUniverseOrigin   // 跟踪空间原点
     * @param fPredictedSecondsFromNow // 预测时间
     * @param pTrackedDevicePoseArray   // 跟踪设备数组
     * @param unTrackedDevicePoseArrayCount // 跟踪设备数组长度
     * @return
     */
    boolean VRSystem_GetDeviceToAbsoluteTrackingPose(int eTrackingUniverseOrigin, float fPredictedSecondsFromNow, float[] pTrackedDevicePoseArray, int unTrackedDevicePoseArrayCount);


    /**
     * VR 关机
     */
    void VR_ShutdownInternal();

    /**
     * 获取控制器状态 (手柄)
     * @param unDeviceIndex 设备索引
     * @param pControllerState 控制器状态
     * @return
     */
    boolean VRSystem_GetControllerState(int unDeviceIndex, VRControllerState_t pControllerState);

    /**
     * 获取控制器的模型名称
     * @param unDeviceIndex // 设备索引
     * @param prop  // 属性
     * @param error // 错误信息
     * @return
     */
    String VRSystem_GetStringTrackedDeviceProperty(int unDeviceIndex, int prop, int error);


    /**
     * 系统环境判断
     * @return
     */
    //TODO 声明一个静态变量来存储 dll 路径  windows32/64 、 Liunx32/64 、osx32、linuxarm64 、androidarm64 不同平台架构的资源

    static String getLibraryPath() {
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("win")) {
            String dllPath = "D:\\VR\\openvr-master\\bin\\win64\\openvr_api.dll"; // 修改为配置文件或环境变量
            System.setProperty("jna.library.path", dllPath);
            return dllPath;
        } else if (osName.contains("linux")) {
            return "/home/cyborg/vr/linux/openvr_api.so";  // 修改为配置文件或环境变量
        } else if (osName.contains("mac")) {
            return "/home/cyborg/vr/mac/openvr_api.dylib"; // 修改为配置文件或环境变量
        } else {
            throw new UnsupportedOperationException("Unsupported operating system: " + osName);
        }
    }

    /**
     * DLL 加载测试
     */
    public class DLLLoaderTest {
        public  static void main(String[] args) {
            String dllPath = "D:\\VR\\openvr-master\\bin\\win64\\openvr_api.dll";
            File dllFile = new File(dllPath);

            if (dllFile.exists()) {
                try {
                    System.load(dllFile.getAbsolutePath());
                    System.out.println("DLL 加载成功！");
                } catch (UnsatisfiedLinkError e) {
                    System.out.println("DLL 加载失败: " + e.getMessage());
                }
            } else {
                System.out.println("DLL 文件不存在: " + dllPath);
            }
        }

    }

}